#include <iostream>

using namespace std;

//1构造函数的分类及调用
//分类
//  按照参数分类 无参构造（默认构造）和有参构造
//  按照类型构造 普通构造和拷贝构造
class Person
{
public:
    //构造函数
    Person()
    {
        cout << "Person 的无参构造函数调用" << endl;
    }
    Person(int a)
    {
        age = a;
        cout << "Person 的有参构造函数调用" << endl;
    }
    Person(const Person &p)
    {
        age = p.age;
        cout << "Person 的拷贝构造函数调用" << endl;
    }

    int age;

    ~Person()
    {
        cout << "Person 的析构函数调用" << endl;
    }
};

void test01()
{
    //1、括号法
    //Person p1;//默认构造函数的调用
    //Person p2(10);
    //Person p3(p2); // 拷贝构造函数的调用

    //注意事项
    //调用默认构造函数时候，不要加()
    //编译器会认为是一个函数的声明

    //cout << "p2的年龄为： " << p2.age << endl;
    //cout << "p3的年龄为： " << p3.age << endl;
    // 2、显示法
    //Person p1;
    //Person p2 = Person(10);
    //Person p3 = Person(p2);

    Person(10);//匿名对象 特点：当前行执行角色后，系统会立即回收掉匿名对象
    cout << "aaaaaa" << endl;

    //注意事项
    //不要利用拷贝构造函数 初始化匿名对象

    // 3、隐式转换法
    Person p4 = 10; // 相当于写了 Person p4 = Person(10);
    Person p5 = p4; // 拷贝构造
}

int main(void)
{
    test01();
    

    return 0;
}